#ifndef __MEMORY_PADDR_H__
#define __MEMORY_PADDR_H__

#include <common.h>

#define PMEM_LEFT  ((paddr_t)CONFIG_MBASE)
#define PMEM_RIGHT ((paddr_t)CONFIG_MBASE + CONFIG_MSIZE - 1)
#define PMEM_RESET (PMEM_LEFT + CONFIG_PC_RESET_OFFSET)

#define DMEM_LEFT  ((ioaddr_t)CONFIG_DBASE)
#define DMEM_RIGHT ((ioaddr_t)CONFIG_DBASE + CONFIG_DSIZE - 1)
#define DMEM_RESET (PMEM_LEFT + CONFIG_DEV_RESET_OFFSET)


uint8_t* paddr_to_ptr(paddr_t paddr);
paddr_t ptr_to_paddr(uint8_t *haddr);
uint8_t* ioaddr_to_ptr(ioaddr_t ioaddr);
ioaddr_t ptr_to_ioaddr(uint8_t *haddr);


static inline bool in_pmem(paddr_t addr) {
  return addr - CONFIG_MBASE < CONFIG_MSIZE;
}

static inline bool in_dmem(ioaddr_t addr) {
  return addr - CONFIG_DBASE < CONFIG_DSIZE;
}


word_t paddr_read(paddr_t addr, int len);
void paddr_write(paddr_t addr, int len, word_t data);
word_t device_read(ioaddr_t addr, int len);
void device_write(ioaddr_t addr, int len, word_t data);

void mem_init();
#endif
